#include <iostream>

using std::cout;
using std::endl;

//不能返回一个局部变量的引用
int & getValue()
{
    //a是一个局部变量
    int a = 10;
    return a;
}

//返回的是一个堆空间变量的引用
//注意：不要轻易返回堆空间变量的引用，
//除非已经有了回收内存的策略
int & getValue2()
{   //完成该函数的实现的是开发者
    int * p1 = new int(10);
    return *p1;
}

void test2()
{
    //使用引用ref之后，就代表堆空间中的变量了
    //& 引用符号
    int & ref = getValue2();//调用getValue2的是一个调用者
    cout << "ref:" << ref << endl;

    //& 取地址符号
    delete &ref;//这种写发比较丑陋, 不够优雅
}


int test1()
{
    int a = 1, b = 2, c = 3;
    a = getValue2();
    cout << "a:" << a << endl;

    a = b + c + getValue2();
    cout << "a:" << a << endl;

    return 0;
}

int test0()
{
    //假如返回成功，那ref就绑定了getValue函数中的局部变量a
    //而当getValue函数执行完毕时，a已经销毁了
    //ref绑定a是没有意义的
    int & ref = getValue();
    cout << "ref:" << ref << endl;

    return 0;
}

int main()
{
    /* test1(); */
    test2();
    return 0;
}

